
#ifndef __TC57CIM_IED_MODULE_H
#define __TC57CIM_IED_MODULE_H

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef _WIN32
#define NOMINMAX
#include <windows.h>
#else
#include <pthread.h>
#include <unistd.h>
#include <sys/time.h> 
#endif

#if defined(_WIN32)
#define DLL_API __declspec(dllexport)   
#else
#define DLL_API  
#endif

	enum
	{
		RT_UNDEFINED_ERROR = -1,
		RT_SUCESS = 0,
		FILE_NOT_EXIST,
		FILE_FORMAT_ERROR,
		PART_NOT_EXIST,
		CREATE_PUBLISHER_ERROR,
		CREATE_SUBSCRIBER_ERROR,
		CREATE_TOPIC_ERROR,
		CREATE_READER_ERROR,
		CREATE_WRITER_ERROR,
	};

/*****************************************************************
**
**	遥测操作相关定义
**
*******************************************************************/

	enum breaker_reading_cvar_st
	{
		NOT_CHECK_VAR = 0,
		DO_CHECK_VAR,
	};

	enum breaker_ai_type_st
	{
		FLOAT_DATA = 0,
		INT_DATA,
	};

	typedef struct
	{
		int no_;
		int type_;
		float fval_;
		int ival_;
		long time_sec_;
		int time_msec_;
	}breaker_reading_ai_st;


/*****************************************************************
**
**	遥信操作相关定义
**
*******************************************************************/
enum breaker_di_type_st
{
	SINGLE_DATA = 0,
	DOUBLE_DATA,
};

typedef struct
{
	int no_;
	int type_;
	char val_;
	long time_sec_;
	int time_msec_;
}breaker_reading_di_st;

/*****************************************************************
**
**	遥控操作相关定义
**
*******************************************************************/
enum breaker_op_st
{
	BR_CTRL_SBOW = 0,
	BR_CTRL_OPER,
	BR_CTRL_CANCEL,
	BR_CTRL_SBOW_CON,
	BR_CTRL_OPER_CON,
	BR_CTRL_CANCEL_CON,
};

enum breaker_pos_st
{
	BR_CTRL_OPEN = 0,
	BR_CTRL_CLOSE,
};

enum breaker_res_st
{
	BR_CTRL_SUCESS = 0,
	BR_CTRL_FAIL,
};

typedef struct
{
	int no_;
	int op_;
	int pos_;
	int res_;
	int invokID_;
}breaker_ctrl_st;

/*****************************************************************
**
**	召唤文件目录相关定义
**
*******************************************************************/

#define MAX_FILE_NAME_LENGTH 256

enum dirtype_st
{
	FileType_rcd = 0,
	FileType_crd,
	FileType_other
};

enum dirmode_st
{
	fileAccessMethod_timeRange = 0,
	fileAccessMethod_all,
	fileAccessMethod_other
};

typedef struct
{
	int dirtype_;
	int mode_;
	long startingTime;
	long endingTime;
}getfiledir_st;

/*****************************************************************
**
**	召唤文件内容相关定义
**
*******************************************************************/
typedef struct
{
	int dirtype_;
	char filename_[MAX_FILE_NAME_LENGTH];
}getfiledata_st;


/*****************************************************************
**
**	定值操作相关定义
**
*******************************************************************/

#define MAX_SG_OP_SUM   2048

enum breaker_sgwr_st
{
	BR_SG_WR_SBOW = 0,
	BR_SG_WR_OPER,
	BR_SG_WR_CANCEL,
	BR_SG_WR_SBOW_CON,
	BR_SG_WR_OPER_CON,
	BR_SG_WR_CANCEL_CON,
};

enum breaker_sgop_st
{
	BR_SG_WR_SG = 0,
	BR_SG_RD_SG,
	BR_SG_RD_SGZONE,
	BR_SG_WR_SGZONE,
};


enum SG_ValType_st
{
	INT_SG_DATA = 0,
	FLOAT_SG_DATA,
};

typedef struct
{
	int no_;
	int ival_;
	float fval_;
	int type_;//INT_SG_DATA、FLOAT_SG_DATA
}breaker_SGData_st;

enum breaker_SGres_st
{
	BR_SG_SUCESS = 0,
	BR_SG_FAIL,
};

typedef struct
{
	int wrst_;
	int opst_;
	int res_;
	int useCount_;
	int zone_;/*定值区*/
	char* breakerID_;

	breaker_SGData_st data_list_[MAX_SG_OP_SUM];
}breaker_SG_st;

/*****************************************************************
**
**	始终同步相关定义
**
*******************************************************************/
typedef struct
{
	unsigned long long seconds_;
	unsigned int millseconds_;
}model_time_st;

/*****************************************************************
**
**	功	能：终端侧model_tc57cim 库版本号
**	函数名：get_lib_version
**	参	数：
**	返	回： 版本号
**	编	写：
**	描	述：
**
*******************************************************************/
const char DLL_API * get_lib_version(void);

/*****************************************************************
**
**	功	能：终端侧model_tc57cim 库初始化
**	函数名：model_init_lib
**	参	数：cidpath：包含目录的cid文件名称
**			qospath：包含目录的qos文件名称
**	返	回：RT_SUCESS：成功
**			RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：程序启动时最先调用
**
*******************************************************************/
int DLL_API model_init_lib(const char *cidpath, const char *qospath);

/*****************************************************************
**
**	功	能：检查终端是否已经完成注册
**	函数名：get_registration_state
**	参	数：
**	返	回： RT_SUCESS：已经注册
**			 FILE_NOT_EXIST/FILE_FORMAT_ERROR：尚未注册
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API get_registration_state(void);

/*****************************************************************
**
**	功	能：启动终端注册服务流程
**	函数名：start_registration_service
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API start_registration_service(void);

/*****************************************************************
**
**	功	能：停止终端注册服务
**	函数名：stop_registration_service
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：可以不调用
**
*******************************************************************/
int DLL_API stop_registration_service(void);

/*****************************************************************
**
**	功	能：发送注册信息
**	函数名：send_registration
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API send_registration(void);

/*****************************************************************
**
**	功	能：设置注册完成回调函数
**	函数名：set_reg_over_callback
**	参	数：handle：注册完成后回调函数
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：可以不调用，通过get_registration_state判断是否注册完成
**
*******************************************************************/
typedef int(*reg_over_callback)(void);
int DLL_API set_reg_over_callback(reg_over_callback handle);

/*****************************************************************
**
**	功	能：启动终端正常业务模式流程
**	函数名：start_normal_service
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：注册成功后调用
**
*******************************************************************/
int DLL_API start_normal_service();

/*****************************************************************
**
**	功	能：停止终端正常业务模式流程
**	函数名：stop_normal_service
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：可以不调用
**
*******************************************************************/
int DLL_API stop_normal_service();

/*****************************************************************
**
**	功	能：检查当前normal_services是否正常
**	函数名：normal_service_is_active
**	参	数：
**	返	回： RT_SUCESS：正常
**			 RT_UNDEFINED_ERROR：未启动
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API normal_service_is_active();

/*****************************************************************
**
**	功	能：检查当前registration_services是否正常
**	函数名：registration_service_is_active
**	参	数：
**	返	回： RT_SUCESS：正常
**			 RT_UNDEFINED_ERROR：未启动
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API registration_service_is_active();

/*****************************************************************
**
**	功	能：获取当前cid文件路径
**	函数名：get_cid_path
**	参	数：
**	返	回：当前cid文件路径及文件名
**	编	写：
**
*******************************************************************/
char DLL_API* get_cid_path(void);

/*****************************************************************
**
**	功	能：获取当前qos文件路径
**	函数名：get_cid_path
**	参	数：
**	返	回：当前qos文件路径及文件名
**	编	写：
**
*******************************************************************/
char DLL_API* get_qos_path(void);

/*****************************************************************
**
**	功	能：存储遥测数据命令，若数据发送变化将自动发送
**	函数名：set_breaker_ai_data
**	参	数：breaker_reading_ai_st：遥测数据信息
**			cvar：是否触发变化上送 DO_CHECK_VAR/NOT_CHECK_VAR
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API set_breaker_ai_data(breaker_reading_ai_st data, int cvar);

/*****************************************************************
**
**	功	能：存储遥信数据命令，若数据发送变化将自动发送
**	函数名：set_breaker_di_data
**	参	数：breaker_reading_di_st：遥信数据信息
**			cvar：是否触发变化上送 DO_CHECK_VAR/NOT_CHECK_VAR
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API set_breaker_di_data(breaker_reading_di_st data, int cvar);

/*****************************************************************
**
**	功	能：设置遥控回调函数
**	函数名：set_brctl_handle_callback
**	参	数：handle：接收到主站遥控指令时的回调函数
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：必须设置，否则遥控不返回
**
*******************************************************************/
typedef int(*brctl_handle_callback)(breaker_ctrl_st data);
int DLL_API set_brctl_handle_callback(brctl_handle_callback handle);


/*****************************************************************
**
**	功	能：发送遥控命令
**	函数名：set_brctl_con
**	参	数：breaker_ctrl_st：遥控命令参数信息
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API set_brctl_con(breaker_ctrl_st data);

/*****************************************************************
**
**	功	能：设置参数回调函数
**	函数名：set_brSG_handle_callback
**	参	数：handle：接收到主站定值指令时的回调函数
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：必须设置，否则定值读写不返回
**
*******************************************************************/
typedef int(*brSG_handle_callback)(breaker_SG_st data);
int DLL_API set_brSG_handle_callback(brSG_handle_callback handle);

/*****************************************************************
**
**	功	能：定值参数操作回复接口
**	函数名：set_brSG_send
**	参	数：data：定值参数信息
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API set_brSG_send(breaker_SG_st data);

/*****************************************************************
**
**	功	能：发送全部遥测数据命令
**	函数名：send_all_breaker_ai_data
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API send_all_breaker_ai_data(void);

/*****************************************************************
**
**	功	能：发送全部遥信数据命令
**	函数名：send_all_breaker_di_data
**	参	数：
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API send_all_breaker_di_data(void);


/*****************************************************************
**
**	功	能：召唤文件目录回调函数
**	函数名：set_getdirectory_handle_callback
**	参	数：handle：接收到主站召唤文件指令时的回调函数
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：必须设置，否则召唤目录不调用
**
*******************************************************************/
typedef int(*getfiledir_handle_callback)(getfiledir_st data);
int DLL_API set_getfiledir_handle_callback(getfiledir_handle_callback handle);

/*****************************************************************
**
**	功	能：召唤文件回调函数
**	函数名：set_getfiledata_handle_callback
**	参	数：handle：接收到主站召唤文件指令时的回调函数
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：必须设置，否则召唤文件指令不调用
**
*******************************************************************/
typedef int(*getfiledata_handle_callback)(getfiledata_st data);
int DLL_API set_getfiledata_handle_callback(getfiledata_handle_callback handle);


/*****************************************************************
**
**	功	能：召唤文件目录应答
**	函数名：set_filedir_to_list
**	参	数：dirType：目录类型，FileType_rcd、FileType_crd、FileType_other
**          filename：文件名，
**          lastFlag：0：非最后一个，1：最后一个文件；系统根据本标识决定是否向主站端发送回复
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：多次循环调用，直至所有文件名全部填入，最后一个文件名填入时lastFlag置1
**
*******************************************************************/
int DLL_API set_filedir_to_list(int dirType,char *filename,int lastFlag);

/*****************************************************************
**
**	功	能：召唤文件目录应答
**	函数名：send_filedata_to_model
**	参	数：dirType：目录类型，FileType_rcd、FileType_crd、FileType_other
**          filename：文件名，
**          filedata：需要发送的文件内容
**          size：文件大小（字节数）
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**	描	述：
**
*******************************************************************/
int DLL_API send_filedata_to_model(int dirType, char* filename, char * filedata,int size,int binType);

/*****************************************************************
**
**	功	能：发送心跳数据
**	函数名：set_heartbeat_send
**	参	数：
**
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
int DLL_API set_heartbeat_send(void);


/*****************************************************************
**
**	功	能：设置对时命令回调函数
**	函数名：set_timesync_handle_callback
**	参	数：handle：接收到主站时钟同步指令时的回调函数
**
**	返	回： RT_SUCESS：成功
**			 RT_UNDEFINED_ERROR：失败
**	编	写：
**
*******************************************************************/
typedef int(*timesync_handle_callback)(model_time_st data);
int DLL_API set_timesync_handle_callback(timesync_handle_callback handle);

#ifdef  __cplusplus
}
#endif

#endif
